﻿using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using SHomeWorkshop.LunarPresentation.Commands;

namespace SHomeWorkshop.LunarPresentation.Dialogs
{
    /// <summary>
    /// Interaction logic for CmdDialog.xaml
    /// </summary>
    public partial class CmdDialog : Window
    {
        public CmdDialog(MainWindow parentWindow)
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Globals.SwitchInputMethod(false);
            cmdInputBox.Focus();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (cmdList.Visibility == Visibility.Collapsed)
            {
                cmdList.Visibility = Visibility.Visible;
                listGridRow.Height = new GridLength(220);
            }
            else
            {
                cmdList.Visibility = Visibility.Collapsed;
                listGridRow.Height = new GridLength(0);
            }
        }

        private void cmdInputBox_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
                case Key.OemTilde:
                case Key.Enter:
                    {
                        if (Globals.selectedEditor == null && cmdInputBox.Text != "gb")
                        {
                            MessageBox.Show("当前未打开任何文档，只能执行“关闭”命令。",
                                Globals.appName, MessageBoxButton.OK, MessageBoxImage.Warning);
                            return;
                        }

                        this.Visibility = Visibility.Hidden;

                        //if (cmdInputBox.Text == "output all cmds")
                        //{
                        //    //将所有命令导出到一个Xml文件。
                        //    XDocument xDoc = new XDocument();

                        //    if (xDoc.Root == null) { xDoc.Add(new XElement("Cmds")); }

                        //    foreach (Cmd cmd in this.cmdList.Items)
                        //    {
                        //        XElement newCmdElement = new XElement("Cmd") { Value = cmd.Description };
                        //        XAttribute attrName = new XAttribute("Name", cmd.CmdName);
                        //        XAttribute attrCmdText = new XAttribute("CmdText", cmd.CmdText);

                        //        newCmdElement.Add(attrName); newCmdElement.Add(attrCmdText);

                        //        xDoc.Root.Add(newCmdElement);
                        //    }

                        //    xDoc.Save(Globals.pathOfUserDirectory + "Cmds.xml");

                        //    this.Close(); return;
                        //}
                        //else
                        //{
                        if (Command.RunTextCmd(cmdInputBox.Text.Replace('_', ' ')))
                        {
                            this.Close(); return;
                        }
                        //}

                        this.Visibility = Visibility.Visible;
                        e.Handled = true;
                        break;
                    }
                case Key.Escape:
                    {
                        this.Close();
                        return;
                    }
            }
        }

        private void cmdList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (cmdList.SelectedItem == null || (cmdList.SelectedItem is Cmd) == false)
            {
                return;
            }

            Cmd c = cmdList.SelectedItem as Cmd;
            cmdInputBox.Text = c.CmdText;
            if (Command.RunTextCmd(c.CmdText.Replace('_', ' ')))
            {
                this.Close();
            }
        }

        private void cmdInputBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (cmdInputBox.Text == "")
            {
                VisualBrush vbrush = (VisualBrush)this.FindResource("textBoxBackground");
                cmdInputBox.Background = vbrush;

            }
            else
            {
                cmdInputBox.Background = Brushes.White;
            }
        }
    }

    public class Cmd : INotifyPropertyChanged
    {
        private string cmdName;
        private string description;
        private string cmdText;


        public event PropertyChangedEventHandler PropertyChanged;

        //public Cmd()
        //{
        //}

        public Cmd(string cmdName, string description, string cmdText)
        {
            this.cmdName = cmdName;
            this.description = description;
            this.cmdText = cmdText;
        }

        public override string ToString()
        {
            return cmdName.ToString();
        }

        public string CmdName
        {
            get { return cmdName; }
            set
            {
                cmdName = value;
                OnPropertyChanged("CmdName");
            }
        }

        public string Description
        {
            get { return description; }
            set
            {
                description = value;
                OnPropertyChanged("Description");
            }
        }

        public string CmdText
        {
            get { return cmdText; }
            set
            {
                cmdText = value;
                OnPropertyChanged("CmdText");
            }
        }

        protected void OnPropertyChanged(string info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }
    }
    public class Cmds : ObservableCollection<Cmd>
    {
        public Cmds()
            : base()
        {
            Add(new Cmd("１级标题", "将当前文本块设置为１级标题。", "1"));
            Add(new Cmd("２级标题", "将当前文本块设置为２级标题。", "2"));
            Add(new Cmd("３级标题", "将当前文本块设置为３级标题。", "3"));
            Add(new Cmd("４级标题", "将当前文本块设置为４级标题。", "4"));
            Add(new Cmd("插入１级标题", "在当前位置插入一个１级标题。", "t1"));
            Add(new Cmd("插入２级标题", "在当前位置插入一个２级标题。", "t2"));
            Add(new Cmd("插入３级标题", "在当前位置插入一个３级标题。", "t3"));
            Add(new Cmd("插入４级标题", "在当前位置插入一个４级标题。", "t4"));
            Add(new Cmd("正文", "将当前文本块设置为正文。", "0|zw"));
            Add(new Cmd("顶级标题", "将当前文本块设置为顶级标题。", "djbt"));
            Add(new Cmd("顶级副标题", "将当前文本块设置为顶级副标题。", "djfbt"));
            Add(new Cmd("树型线", "切换１－４级标题文本块“是否绘制树型连线”。", "sxx"));
            Add(new Cmd("全开树型线", "开启当前子面板中所有标题文本块的树型线。", "qksxx"));
            Add(new Cmd("全关树型线", "关闭当前子面板中所有标题文本块的树型线。", "qgsxx"));

            Add(new Cmd("首式", "选取当前公式内嵌的第一个公式（如果存在）。", "ss"));
            Add(new Cmd("尾式", "选取当前公式内嵌的最后一个公式（如果存在）。", "ws"));

            Add(new Cmd("边框宽", "设置当前公式的边框宽度，取值范围[0,20]。", "bkk {宽度值}"));
            Add(new Cmd("前景色", "设置当前公式的前景色。", "qjs {色彩名称}"));
            Add(new Cmd("背景色", "设置当前公式的背景色。", "bjs {色彩名称}"));
            Add(new Cmd("边框色", "设置当前公式的边框色。", "bks {色彩名称}"));

            Add(new Cmd("叶面板上移一位", "将当前叶面板向上移动一位（如果允许）。", "ys"));
            Add(new Cmd("叶面板下移一位", "将当前叶面板向下移动一位（如果允许）。", "yx"));
            Add(new Cmd("选中所在树的叶首面板", "选中当前叶面板所在树的叶首面板。", "yc"));
            Add(new Cmd("叶面板左移一层", "将当前叶面板向左移动一层（如果允许）。", "yz"));
            Add(new Cmd("叶面板右移一位", "将当前叶面板向右移动一层（如果允许）。", "yy"));

            Add(new Cmd("插列（左）", "在当前网格子面板所在列左侧插入新列。", "cl"));
            Add(new Cmd("插列【右】", "在当前网格子面板所在列右侧插入新列。", "cly"));
            Add(new Cmd("插列【右，批量】", "在当前网格子面板所在列右侧批量插入新列（不超过10）。\r\n" +
                "注意：命令与数字间有一个半角英文空格。\r\n" + "例如：cly 3", "cly {数字}"));
            Add(new Cmd("插行（上）", "在当前网格子面板所在行上侧插入新行。", "ch"));
            Add(new Cmd("插行【下】", "在当前网格子面板所在行下侧插入新行。", "chx"));
            Add(new Cmd("插行【下，批量】", "在当前网格子面板所在行下侧批量插入新行（不超过10）。\r\n" +
                "注意：命令与数字间有一个半角英文空格。\r\n" + "例如：chx 3", "chx {数字}"));

            Add(new Cmd("合并（右）", "当前选中的网格子面板向右合并一列。", "hb"));
            Add(new Cmd("合并【下】", "当前选中的网格子面板向下合并一行。", "hbx"));
            Add(new Cmd("拆分", "取消当前网格子面板的合并状态。", "cf"));
            Add(new Cmd("删列", "删除当前网格子面板所在列。", "sl"));
            Add(new Cmd("删行", "删除当前网格子面板所在行。", "sh"));

            Add(new Cmd("客观", "在当前公式后面插入一道客观题。", "kg"));
            Add(new Cmd("主观", "在当前公式后面插入一道主观题。", "zg"));
            Add(new Cmd("三角", "在当前公式后面插入一道三角式。", "sj"));
            Add(new Cmd("交叉", "在当前公式后面插入一个交叉关系式。", "jc"));
            Add(new Cmd("矛盾", "在当前公式后面插入一个[矛盾/对立]关系式。", "md"));
            Add(new Cmd("属种", "在当前公式后面插入一个属种关系式。", "sz"));

            Add(new Cmd("默认前景色", "更改当前文档的默认前景色。\r\n" +
                "注意：命令与色彩名称间有一个半角英文空格。\r\n" +
                "　　　有效的色彩名称可以从拾色器上获取（必是英文）。\r\n" +
                "例如：mrqjs AliceBlue", "mrqjs {色彩名称}"));

            Add(new Cmd("默认背景色", "更改当前文档的默认前景色。\r\n" +
                "注意：命令与色彩名称间有一个半角英文空格。\r\n" +
                "　　　有效的色彩名称可以从拾色器上获取（必是英文）。\r\n" +
                "例如：mrbjs AliceBlue", "mrbjs {色彩名称}"));

            Add(new Cmd("选框色1", "更改当前文档中普通公式的选取框的色彩。\r\n" +
                "注意：命令与色彩名称间有一个半角英文空格。\r\n" +
                "　　　有效的色彩名称可以从拾色器上获取（必是英文）。\r\n" +
                "例如：xks1 AliceBlue", "xks1 {色彩名称}"));

            Add(new Cmd("选框色2", "更改当前文档中子面板的选取框的色彩。\r\n" +
                "注意：命令与色彩名称间有一个半角英文空格。\r\n" +
                "　　　有效的色彩名称可以从拾色器上获取（必是英文）。\r\n" +
                "例如：xks2 AliceBlue", "xks2 {色彩名称}"));

            Add(new Cmd("旋转", "设置当前公式的旋转角度。"+
                "　　　有效取值范围是[-180,180]。\r\n" +
                "例如：xz -45", "xz {旋转角度}"));

            Add(new Cmd("白底黑字", "自动更改当前文档的配色方案。\r\n" +
                "注意：白底黑字比较好看些，但刺眼。默认是黑底白字。\r\n" +
                "　　　——这其实就是个组合命令。", "bdhz"));
            Add(new Cmd("白底彩字", "自动更改当前文档的配色方案。\r\n" +
                "注意：白底彩字，除标题文本自动变色外与“白底黑字”同。\r\n" +
                "　　　——这其实就是个组合命令。", "bdhz"));

            Add(new Cmd("黑底白字", "自动更改当前文档的配色方案。\r\n" +
                "注意：白底黑字比较好看些，但刺眼。默认是黑底白字。\r\n" +
                "　　　——这也是个组合命令。", "hdbz"));
            Add(new Cmd("黑底彩字", "自动更改当前文档的配色方案。\r\n" +
                "注意：黑底彩字，除标题文本自动变色外与黑底白字同。\r\n" +
                "　　　——这也是个组合命令。", "hdbz"));

            Add(new Cmd("花纹底黑字", "自动更改当前文档的配色方案。\r\n" +
                "注意：花纹底黑字比黑底白字更符合习惯，比纯白底更舒\r\n" +
                "　　　服些。本质上是将默认背景色设置成了透明色。\r\n" +
                "　　　——这也是个组合命令。", "hwdhz"));
            Add(new Cmd("花纹底彩字", "自动更改当前文档的配色方案。\r\n" +
                "注意：花纹底黑字，除标题文本自动变色外与“花纹底黑字”同。\r\n" +
                "　　　——这也是个组合命令。", "hwdhz"));

            Add(new Cmd("置默认配色", "保存当前文档的配色方案。\r\n" +
                "下次启动程序后新建的文档将默认采用此配色方案。", "zmrps"));

            Add(new Cmd("清除默认配色", "清除当前使用的“新建文档配色方案”。\r\n" +
                "下次启动程序后生效。此操作不可恢复！", "qcmrps"));

            Add(new Cmd("文本渲染", "更改文本渲染模式——与文档无关。\r\n" +
                "注意：命令与色彩名称间有一个半角英文空格。\r\n" +
                "　　　渲染模式有两种：rh表示柔和，适合字体较大时；\r\n" +
                "　　　　　　　　　　　rl表示锐利，适合字体较小时。\r\n" +
                "例如：wbxr rh", "wbxr {渲染模式}"));

            Add(new Cmd("自动折行", "设置当前文档中的文本块是否自动折行。\r\n" +
                "　　注意：{k|g}，分别表示开、关。\r\n" +
                "　　例如：zdzh k", "zdzh {k|g}"));

            Add(new Cmd("填空", "将当前文本块转换成一个填空。\r\n" +
                "文本块原先的后台文本将被抛弃，而主文本将移至后台，\r\n" +
                "新的主文本将类似：____▲____。", "tk"));

            Add(new Cmd("贴网格", "将复制的文本（可以是Excel数据块）贴成一个新网格式。\r\n" +
                "此功能可能存在错误，因未重复出现，无法排除。慎用！", "twg"));

            Add(new Cmd("转扩展", "将选中的括弧式转换成一个扩展式。", "zkz"));
            Add(new Cmd("转括弧", "将选中的扩展式转换成一个括弧式。", "zkh"));

            Add(new Cmd("打印", "打印当前文档。\r\n注意：此功能有效性尚未经验证！", "dy"));
            Add(new Cmd("转富文本块", "将当前选中的“行”转换为一个富文本块。\r\n" +
                "注意：①“行”中只能有文本块和上下标式！\r\n" +
                "　　　②“行”最多嵌套两层。", "zfwbk"));

            Add(new Cmd("页眉", "为当前文档设置页眉文本。\r\n注：未提供页脚功能。", "ym"));
            Add(new Cmd("半自动编号", "令当前子面板在“尝试半自动编号”与\r\n“关闭半自动编号”之间切换。", "bzdbh"));

            Add(new Cmd("另存为", "将当文档另存为一个新磁盘文件。", "lcw"));

            Add(new Cmd("总在最前", "令主窗口在Windows桌面顶端。", "zzzq"));

            Add(new Cmd("导出文档", "将当前文档导出为一个PNG格式的图片文件。", "dcwd"));
            Add(new Cmd("导出公式", "将当前公式导出为一个PNG格式的图片文件。", "dcgs"));
            Add(new Cmd("置通配式", "将当前公式指定为通配式。", "ztps"));
            Add(new Cmd("帮助", "打开帮助文档。", "?"));
            Add(new Cmd("帮助", "打开关于“命令模式”的帮助文档。", "help"));

            Add(new Cmd("关闭", "关闭整个程序。", "gb"));
        }
    }
}
